using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using FiltronASP.Models.DAO.Interfaces;
using System.Web.Mvc;

namespace FiltronASP.Models.DAO.Extensions
{
    /// <summary>
    /// Klasa zawierajaca rozszerzenia metod zwiazanych z tabela grup stron.
    /// </summary>
    public static class PageTypeExtensions
    {

        /// <summary>
        /// Metoda do pobierania domyslnego id grupy stron (gdy nie jest przekazywana jako parametr).
        /// </summary>
        /// <param name="pageTypeDAO">klasa odpowiedzialna za operacja na bazie danych, tabela grup stron</param>
        /// <param name="languageId">wersja jezykowa</param>
        /// <returns>domyslne id grupy stron</returns>
        public static PageType GetDefaultPageType(this IPageTypeDAO pageTypeDAO, Language language)
        {
            if (language == null)
            {
                return null;
            }   //if
            if (pageTypeDAO == null)
            {
                return null;
            }   //if null
            IQueryable<PageType> pageTypes = pageTypeDAO.FindByLanguage(language.language_id);
            if (pageTypes == null)
            {
                return null;
            }   //if null
            if (!pageTypes.Any())
            {
                return null;
            }   //if null
            return pageTypes.First();
        }

        /// <summary>
        /// Metoda pomocnicza konwertujaca liste dostepnych grup stron z bazy do 
        /// IEnumerable<SelectListItem>.
        /// </summary>
        /// <param name="pageTypes">kolekcja</param>
        /// <param name="selectedId">wybrane id</param>
        /// <returns>liste mozliwa do wrzucenia w drop downa</returns>
        public static IEnumerable<SelectListItem> ToSelectListItems(this IQueryable<PageType> pageTypes,
            int? selectedId)
        {
            if (pageTypes == null)
            {
                return null;
            }   //if
            if (selectedId != null)
            {
                return pageTypes.OrderBy(pageType => pageType.page_type_name)
                         .Select(pageType =>
                             new SelectListItem
                             {
                                 Selected = (pageType.page_type_id == selectedId),
                                 Text = pageType.page_type_name,
                                 Value = pageType.page_type_id.ToString()
                             });
            }   //if not null
            else
            {
                return pageTypes.OrderBy(pageType => pageType.page_type_name)
                         .Select(pageType =>
                             new SelectListItem
                             {
                                 Text = pageType.page_type_name,
                                 Value = pageType.page_type_id.ToString()
                             });
            }   //else not null
        }

        /// <summary>
        /// Metoda do sprawdzania czy szablon jest wybrany dla grupy.
        /// </summary>
        /// <param name="pageType">grupa stron</param>
        /// <param name="template">szablon</param>
        /// <returns>true, gdy wybrany</returns>
        public static bool IsTemplateChecked(this PageType pageType, Template template) 
        {
            if (pageType == null)
            {
                return false;
            }   //if
            if (template == null)
            {
                return false;
            }   //if
            IPageTypeAcceptableTemplateDAO pageTypeAcceptableTemplateDAO = new PageTypeAcceptableTemplateDAO();
            return (pageTypeAcceptableTemplateDAO.FindByPageAndTemplate(pageType.page_type_id, template.template_id) != null);
        }

    }
}
